package com.sisgesbyte.dao.seguridad;

import java.util.List;

import javax.ejb.Stateless;
import javax.inject.Inject;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import com.sisgesbyte.dao.beanDao.FiltrosSQLBean;
import com.sisgesbyte.dao.beanDao.UsuarioDetRequest;
import com.sisgesbyte.dao.utilDao.CreaFiltroSqlString;
import com.sisgesbyte.data.entity.comun.GenericEntity;
import com.sisgesbyte.data.entity.seguridad.UsuarioListaEntity;
import com.sisgesbyte.data.util.AbstractFacade;

@Stateless
public class MantenimientoUsuarioDaoImpl extends AbstractFacade<UsuarioListaEntity> implements MantenimientoUsuarioDao {

	@Inject
	private CreaFiltroSqlString creaFiltroSqlString;
	
	@PersistenceContext(unitName = "SigesSiscompPU")
	private EntityManager em;

	@Override
	protected EntityManager getEntityManager() {
		return em;
	}
	
	public MantenimientoUsuarioDaoImpl(){
		super(UsuarioListaEntity.class);
	}

	
	@Override
	public List<UsuarioListaEntity> listaUsuarios(FiltrosSQLBean cadenaFiltros) {
		
		StringBuilder jpql = new StringBuilder();
			jpql.append("select us.id,em.id codempresa,em.razon_social empresa,us.rol_id, ro.nombre rol, us.usuario,us.clave, us.active  ");
			jpql.append("from seguridad.usuario us ");
			jpql.append("inner join seguridad.rol ro on us.rol_id=ro.id ");
			jpql.append("inner join sistema.empresa em on us.empresa_id=em.id ");
			// concatenamos el filtro
			if (cadenaFiltros != null) {
				StringBuilder filtro = new StringBuilder();
				filtro.append(creaFiltroSqlString.concatenar(cadenaFiltros));
				jpql.append(filtro.toString());
			}
			Query query = em.createNativeQuery(jpql.toString(), UsuarioListaEntity.class);
			if (cadenaFiltros != null && cadenaFiltros.getListaValores() != null
					&& cadenaFiltros.getListaValores().size() > 0) {
				int num = 0;
				for (Object valor : cadenaFiltros.getListaValores()) {
					query.setParameter(++num, valor);
				}
			}
			List<UsuarioListaEntity> ls = query.getResultList();
			
		return ls;
	}

	@Override
	public GenericEntity guardarUsuario(UsuarioDetRequest usuario) {
		
		StringBuilder jpql = new StringBuilder();
			jpql.append("select * from seguridad.sp_insertar_usuario(:empredaid, :usuario_sys, :clave_sys, :rol, :active )");
		
			Query query = em.createNativeQuery(jpql.toString(), GenericEntity.class);
				query.setParameter("empredaid",usuario.getCodEmpresa());
				query.setParameter("usuario_sys", usuario.getUsuario());
				query.setParameter("clave_sys", usuario.getClave());
				query.setParameter("rol", usuario.getCodRol());
				query.setParameter("active", usuario.getActive());
			
		return (GenericEntity)query.getSingleResult();
	}

	@Override
	public GenericEntity actualizarUsuario(UsuarioDetRequest usuario) {
		
		StringBuilder jpql = new StringBuilder();
		jpql.append("select * from seguridad.sp_actualizar_usuario(:in_usuarioid, :in_rolid, :in_empresaid, :in_usuario, :in_clave, :in_active )");
	
		Query query = em.createNativeQuery(jpql.toString(), GenericEntity.class);
			query.setParameter("in_usuarioid",usuario.getCodUsuario());
			query.setParameter("in_rolid", usuario.getCodRol());
			query.setParameter("in_empresaid", usuario.getCodEmpresa());
			query.setParameter("in_usuario", usuario.getUsuario());
			query.setParameter("in_clave", usuario.getClave());
			query.setParameter("in_active", usuario.getActive());
		
		return (GenericEntity) query.getSingleResult();
	}

	@Override
	public GenericEntity eliminarUsuario(int codUsuario) {
		

		StringBuilder jpql = new StringBuilder();
		jpql.append("select * from seguridad.sp_eliminar_usuario(:in_usuarioid)");
	
		Query query = em.createNativeQuery(jpql.toString(), GenericEntity.class);
			query.setParameter("in_usuarioid", codUsuario);

		return (GenericEntity) query.getSingleResult();
	}

}
